x402

x402 多链(六):Solana、Stellar 适配与多语言 SDK

一次 402 质询可以同时声明多条链多个资产。EVM 用 EIP-3009,Solana 用部分签名交易,Stellar 用 Soroban 授权;TypeScript、Python、Go、.NET、Java、Ruby 都有可用实现。

第三篇的示例跑在 Base(EVM)上。但 x402 从设计上就是多链的——服务器返回的 accepts 数组可以同时列出 Base、Solana、Stellar 的支付选项,客户端按自己的钱包情况挑。这篇讲两件事:非 EVM 链上支付怎么实现,以及主流后端语言都有哪些 SDK 可用。

多链的统一抽象:CAIP-2 网络标识符

x402 V2 用 CAIP-2 标准统一标识网络:

网络 CAIP-2 标识
Base 主网 eip155:8453
Base Sepolia 测试网 eip155:84532
Solana 主网 solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
Stellar stellar:...(网络哈希标识)

服务器配置多链收费时,直接在 accepts 数组里加多个条目:

{
  "accepts": [
    { "scheme": "exact", "network": "eip155:8453", "asset": "0xUSDC_on_Base", "amount": "10000", "payTo": "0x..." },
    { "scheme": "exact", "network": "solana:5eykt...", "asset": "USDC_SOL", "amount": "10000", "payTo": "solana_address" },
    { "scheme": "exact", "network": "stellar:...", "asset": "USDC_STELLAR", "amount": "10000", "payTo": "stellar_address" }
  ]
}

客户端 SDK 拿到质询后,遍历 accepts 找到自己钱包支持的链,用对应的签名机制完成支付。

Solana:部分签名交易(Partially Signed Transaction)

Solana 没有 EIP-712/EIP-3009 这套离线授权体系,x402 的实现方式是部分签名交易:

  1. 客户端在本地构建标准 SPL Token 转账指令(transfer_checked,转 USDC)
  2. 用钱包私钥签名这笔交易,但不签名 Fee Payer(交易费支付者)部分
  3. 把不完整的交易放进 PAYMENT-SIGNATURE 重试
  4. Facilitator 验证转账额度和签名后,补上 Fee Payer 签名,垫付交易费(通常低于 $0.001,视网络状态)上链

效果和 EVM 一样:在 Facilitator 赞助的前提下,买家钱包只需要有 USDC,不需要持有 SOL。这是 Solana 上“无 Gas 支付”的标准做法(赞助交易 Sponsored Transaction 等生态惯例),x402 只是把它接进了 HTTP 支付流程。

Stellar:Soroban 授权条目签名

Stellar 的实现走智能合约平台 Soroban:

  1. 客户端钱包对特定的 Soroban 合约调用(代币转移操作)做授权条目签名(Authorization Entry)——签“授权”而不是组装整笔交易
  2. 资产标准是 SEP-41(Stellar Asset Contract),默认清算资产是 Stellar USDC
  3. 高并发场景下,OpenZeppelin 的 Facilitator 插件支持 Channels Service:用托管渠道账户池并发提交交易,自动协调账户 sequence 号,避免高频微支付把账户序列号锁死

Stellar 路径的成熟度比 EVM/Solana 低一些,但它是 OpenZeppelin 插件的主要目标链之一(据插件文档)。

x402 三链支付机制对比

各链机制对比

维度 EVM(Base 等) Solana Stellar
签名机制 EIP-3009 离线授权(EIP-712) 部分签名交易 Soroban 授权条目
买家需要持有 仅 USDC(赞助路径下) 仅 USDC(赞助路径下) 仅 USDC(赞助路径下)
交易费赞助方 Facilitator Facilitator(补 Fee Payer 签名) Facilitator(Channels 池)
并发能力 随机 nonce,无碰撞 交易级并发 渠道账户池防 sequence 冲突
资产标准 ERC-20(USDC/EURC) SPL Token SEP-41

共同点:在 Facilitator 赞助/托管路径下,买家不需要持有链的原生代币。这是 x402 “让机器付钱”的前提——你不会指望一个 Agent 的钱包里既备 USDC 又备 ETH/SOL。

多语言 SDK 生态

多语言 SDK 生态

官方 TypeScript/Python/Go SDK 加上社区实现,主流后端语言都有可用方案:

语言 库 状态 特色
TypeScript @x402/*(官方) 官方 覆盖 fetch/axios/express/fastify/hono/next 等全栈;EVM/SVM/Stellar/Aptos 多链
Python x402(官方) 官方 pip install x402,官方 Python SDK
Go go/v2(官方) 官方 go get github.com/x402-foundation/x402/go/v2
Go x402-go(mark3labs) 社区成熟 net/http、Chi、Gin、PocketBase 全支持;EVM+SVM 签名器;带 MCP 集成
Go okx/payments/go/x402 社区 OKX 出品;内置 Schema Builder,402 响应里直接声明 API 的输入输出结构
C#/.NET x402-dotnet 较成熟 ASP.NET Core 中间件、[PaymentRequired] 特性、Minimal API 过滤器;v2.0 起支持 x402 V2,NuGet 包 x402/x402.Client.EVM
Java Mogami 社区 专为 Java 生态打磨
Ruby x402-rails 社区 Rails 集成
边缘 Cloudflare Workers 官方支持 Hono 中间件原生适配,可部署到 Workers

两个语言的接入方式:

C#(x402-dotnet 2.x,API 来自官方 README):

var builder = WebApplication.CreateBuilder(args);

// 注册 x402 服务并连接 Facilitator
builder.Services.AddX402().WithHttpFacilitator(facilitatorUrl);

var app = builder.Build();

app.MapGet("/api/premium/data", () => Results.Ok(new { data = "付费数据" }));

// 用 PaymentRequired 特性保护端点
app.MapGet("/api/premium/protected", [PaymentRequired("1000", "0x036CbD53842c5426634e7929541eC2318f3dCF7e", "0xYourAddressHere")] () => Results.Ok(new { data = "付费数据" }));

app.Run();

C# 客户端甚至更省事:NuGet 包 x402.Client.EVM 提供了增强版 HttpClient——你正常写 GetAsync,它在底层自动侦测 402、静默完成 EIP-3009 签名并重新请求,业务代码零感知。Go 侧则推荐官方 Go SDK 或 mark3labs 的 x402-go(中间件式接入,API 以各库文档为准)。

选择建议

  • 新项目、Agent 服务:TypeScript(官方主推)或 Go(高并发、生态全)
  • 企业现有 .NET 栈:x402-dotnet 的中间件/特性/过滤器三件套,接入成本最低
  • 边缘/Serverless:Hono + Cloudflare Workers,原生适配
  • Python 团队:官方 x402 包
  • 只想要数据:Python/TS 走 Zyte/Exa 这类现成服务,不用自己实现协议

小结

x402 的多链设计从协议层就统一了抽象:CAIP-2 标识网络、accepts 数组声明选项、客户端签名机制按链自动切换、Facilitator 统一做交易费赞助。语言层面,官方 TypeScript/Python/Go 加上社区 .NET/Java/Ruby 实现已覆盖主流栈,接入方式都遵循同一个模式:注册签名方案 → 包装请求/保护路由 → 完成。